unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Menus,
  ComCtrls, ExtCtrls, jwawinuser, lNetComponents, lNet, Process, StdCtrls;

type

  { config }
  
  config = record
    COM : string[1];
    tipo_impresor : string[20];
    borrar : boolean;
  end;
  
  { TForm1 }

  TForm1 = class(TForm)
    LTCP: TLTCPComponent;
    MainMenu1: TMainMenu;
    MenuItem1: TMenuItem;
    MenuItem10: TMenuItem;
    MenuItem11: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    MenuItem4: TMenuItem;
    MenuItem5: TMenuItem;
    MenuItem6: TMenuItem;
    MenuItem7: TMenuItem;
    MenuItem8: TMenuItem;
    MenuItem9: TMenuItem;
    PopupMenu1: TPopupMenu;
    StatusBar1: TStatusBar;
    SystrayIcon: TTrayIcon;
    procedure FormCreate(Sender: TObject);
    procedure FormDockDrop(Sender: TObject; Source: TDragDockObject; X,
      Y: Integer);
    procedure FormShow();
    procedure FormStartDock(Sender: TObject; var DragObject: TDragDockObject);
    procedure LTCPAccept(aSocket: TLSocket);
    procedure LTCPDisconnect(aSocket: TLSocket);
    procedure LTCPReceive(aSocket: TLSocket);
    procedure MenuItem11Click(Sender: TObject);
    procedure MenuItem3Click(Sender: TObject);
    procedure MenuItem5Click(Sender: TObject);
    procedure MenuItem7Click(Sender: TObject);
    procedure MenuItem8Click(Sender: TObject);
    procedure MenuItem9Click(Sender: TObject);
    procedure restaurar();
    procedure MenuItem4Click(Sender: TObject);
    procedure ocultar();
    procedure SystrayIconDblClick(Sender: TObject);
    procedure crear_archivo(mensaje : string; socket : TLSocket);
    procedure escribir(mensaje : string; socket : TLSocket);
    procedure borrar_archivo(mensaje : string; socket : TLSocket);
    procedure cantidad_conexiones(socket : TLSocket);
    procedure ejecutar_fiscal(mensaje : string; socket : TLSocket);
  private
    archivo : file of config;
    testigo : longint;
    archivo_fiscal : TextFile;
    nro_conexion : longint;
    nombrearchivo : string;
  public
    { public declarations }
  end; 

var
  Form1: TForm1;
  comando_fiscal : string;
  impresor_fiscal : config;

const
  IDI_ICON1 = 101;
  ptoIP = 1313;

implementation

uses
  Unit2;

{ TForm1 }

procedure TForm1.ejecutar_fiscal(mensaje : string; socket : TLSocket);
var
  comando : string;
  posnombre : longint;
  proceso : TProcess;
  infile : string;
  outfile : string;
  
begin
  posnombre := pos('>', mensaje);
  infile := RightStr(mensaje, Length(mensaje) - (posnombre));
  outfile := LeftStr(infile, Length(infile) - 3) + 'ans';
  
  if impresor_fiscal.tipo_impresor = 'Hasar' then
    comando := comando_fiscal + infile
  else
  if impresor_fiscal.tipo_impresor = 'Epson Ticket' then
    comando := comando_fiscal + infile + ' -o ' + outfile;
  
  proceso := TProcess.Create(nil);
  proceso.CommandLine := comando;
  proceso.Options := proceso.Options + [poWaitOnExit];
  proceso.Execute;
  proceso.Free;
  
  LTCP.SendMessage('fiscal_ejecutado', socket);
end;

procedure TForm1.cantidad_conexiones(socket : TLSocket);
begin
  LTCP.SendMessage(IntToStr(nro_conexion), socket);
end;

procedure TForm1.crear_archivo(mensaje : string; socket : TLSocket);
var
  posnombre : longint;
  
begin
  posnombre := pos('>', mensaje);
  mensaje := RightStr(mensaje, Length(mensaje) - (posnombre));

  nombrearchivo := 'archivo' + mensaje + '.fis';
  
  AssignFile(archivo_fiscal, nombrearchivo);
  Rewrite(archivo_fiscal);
  CloseFile(archivo_fiscal);
  
  LTCP.SendMessage(nombrearchivo, socket);
end;

procedure TForm1.borrar_archivo(mensaje : string; socket : TLSocket);
var
  posnombre : longint;

begin
  posnombre := pos('>', mensaje);
  mensaje := RightStr(mensaje, Length(mensaje) - (posnombre));

  nombrearchivo := mensaje;

  if impresor_fiscal.borrar = true then
    DeleteFile(nombrearchivo);
  
  LTCP.SendMessage('archivo_borrado: ' + nombrearchivo, socket);
end;

procedure TForm1.escribir(mensaje : String; socket : TLSocket);
var
  posnombre : longint;
  
begin
  posnombre := pos('>', mensaje);
  mensaje := RightStr(mensaje, Length(mensaje) - (posnombre));
  
  posnombre := pos('>', mensaje);
  nombrearchivo := LeftStr(mensaje, posnombre - 1 );
  mensaje := RightStr(mensaje, Length(mensaje) - (posnombre));
  AssignFile(archivo_fiscal, nombrearchivo);
  Append(archivo_fiscal);
  Writeln(archivo_fiscal, mensaje);
  CloseFile(archivo_fiscal);
  
  LTCP.SendMessage('Escrito: ' + mensaje, socket);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  testigo := 0;
  
  nro_conexion := 0;

  SystrayIcon.Icon.Handle := LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));

  SystrayIcon.PopUpMenu := PopUpMenu1;
end;

procedure TForm1.FormDockDrop(Sender: TObject; Source: TDragDockObject; X,
  Y: Integer);
begin
  ShowMessage('OK2');
end;

procedure TForm1.FormShow();
begin
  if FileExists('.\configuracion.dat') = False then
  begin
    StatusBar1.SimpleText := 'Sin configurar Puerto Impresor Fiscal';
    Form2.ShowModal;
  end;
  
  AssignFile(archivo, 'configuracion.dat');
  Reset(archivo);
  Read(archivo, impresor_fiscal);
  CloseFile(archivo);
  
  StatusBar1.SimpleText := impresor_fiscal.tipo_impresor + ' en COM' + impresor_fiscal.COM;
  SystrayIcon.Hint := impresor_fiscal.tipo_impresor + ' en COM' + impresor_fiscal.COM;
  
  if impresor_fiscal.tipo_impresor = 'Hasar' then
    comando_fiscal := 'wspooler.exe -v 9600 -p' + impresor_fiscal.COM +' -f '
  else
  if impresor_fiscal.tipo_impresor = 'Epson Ticket' then
    comando_fiscal := 'ixbatch.exe -r "27-0163848-435" -s 9600 -p COM' + impresor_fiscal.COM + ' -i ';
  
  if testigo = 0 then
  begin
    LTCP.Listen(ptoIP);
    ocultar();
  end;
end;

procedure TForm1.FormStartDock(Sender: TObject; var DragObject: TDragDockObject
  );
begin
  ShowMessage('DOCK');
end;

procedure TForm1.LTCPAccept(aSocket: TLSocket);
begin
  nro_conexion += 1;
  sleep(500);
  LTCP.SendMessage(IntToStr(nro_conexion), aSocket);
end;

procedure TForm1.LTCPDisconnect(aSocket: TLSocket);
begin
  nro_conexion -= 1;
end;

procedure TForm1.LTCPReceive(aSocket: TLSocket);
var
  mensaje : string;

begin
  if aSocket.GetMessage(mensaje) > 0 then
  begin
    if mensaje = 'ping' then LTCP.SendMessage('pong', aSocket)
    else
    if mensaje = 'cantidad_conexiones' then cantidad_conexiones(aSocket)
    else
    if LeftStr(mensaje, 13)  = 'crear_archivo' then crear_archivo(mensaje, aSocket)
    else
    if LeftStr(mensaje, 15) = 'ejecutar_fiscal' then ejecutar_fiscal(mensaje, aSocket)
    else
    if LeftStr(mensaje, 14) = 'borrar_archivo' then borrar_archivo(mensaje, aSocket)
    else
    if LeftStr(mensaje, 8) = 'escribir' then escribir(mensaje, aSocket);
  end;
end;

procedure TForm1.MenuItem11Click(Sender: TObject);
begin
  Form2.ShowModal;
end;

procedure TForm1.MenuItem3Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.MenuItem5Click(Sender: TObject);
begin
  ocultar();
end;

procedure TForm1.MenuItem7Click(Sender: TObject);
begin
  MessageDlg ('Acerca de...', 'Servidor de Impresion Fiscal 1.0.1',
    mtInformation, [mbClose],0);
end;

procedure TForm1.MenuItem8Click(Sender: TObject);
begin
  MessageDlg ('Acerca de...', 'Servidor de Impresion Fiscal',
    mtInformation, [mbClose],0);
end;

procedure TForm1.MenuItem9Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.restaurar();
begin
  SystrayIcon.Visible := false;
  Form1.Visible := true;
end;

procedure TForm1.MenuItem4Click(Sender: TObject);
begin
  Form2.ShowModal;
  FormShow();
end;

procedure TForm1.ocultar();
begin
  Form1.Visible := false;
  
  if testigo = 0 then
  begin
    SystrayIcon.Show;
    testigo := 1;
  end
  else
    SystrayIcon.Visible := true;
end;

procedure TForm1.SystrayIconDblClick(Sender: TObject);
begin
  restaurar();
end;

initialization
  {$I unit1.lrs}

end.

